As is well known, both the hardware and the software incorporated within modem computer systems are considerable more complex than in years past. In early incarnations of computer systems, the hardware often consisted of a single processor configured to execute software programs that were typically relatively small and generally comprised only a single text file of source code.
Paralleling the increase in sophistication and complexity of the hardware components of modern computer systems, software programs have also become larger and more complex. In addition, software programs are now typically organized into a plurality of cooperative modules. Organizing a software program into a number of modules enable each such module to be separately compiled into object code, which may typically be effected in significantly less time than compiling an entire program. In addition, modular programming has permitted segments of code to be reused both within a given program as well as between separate programs.
However, the general acceptance of modular programming techniques has created a concomitant need a need for methods of generating and maintaining versions of complex software programs composed of a plurality of modules, each of which is capable of being edited by multiple users. For a rather prolonged period, there was little development of automated “configuration management” or “version control” software to address this need. Rather, documentation and control of current versions of software programs was generally painstakingly accomplished using manual configuration management techniques.
One early approach to automated configuration management involved maintenance of references between the source code files of program modules within a centralized “project” file. The project file generally contains a record such source code files along with references between the files and a current “state” of each file. Generally, a date and time stamp is applied to each source code file upon modification of the file. When this approach to configuration management is employed, compiling of the program involves performing a “build” during which all source code files in the project database which need recompiling are sequentially compiled. During each such subsequent “build” operation, the configuration management software compares the time stamp of each source code file to a time stamp corresponding the most recent build operation. Those source codes files which have a time stamp later than the last build date are recompiled before linking.
Although the project file approach may lead to satisfactory results for programs comprises of relatively small numbers of modules edited by a relatively few number of users, in larger projects various difficulties may arise. For example, because this approach provides no meaningful coordination between editing and “versioning” of program modules (which is typically effected only when the configuration management systems is invoked by users), a number of configuration management errors have been found to frequently arise. One such error occurs when multiple users happen to simultaneously edit a single file. Another error occurs when unsaved buffers or work areas are not incorporated in a new version of the program created during a build operation, which is one of the adverse consequences which may arise when the contents of a work area do not remain synchronized with the file repository of the configuration management system. In addition, new files created by a user may be lost if the user does not inform the configuration management system of the existence of such files.
These difficulties associated with current approaches to configuration management are exacerbated by the fact that software is being developed more quickly than ever before. Integrated development tools and environments enable rapid prototyping of complex applications, and tools often are used to generate application code. Software that once took months or years to develop can be put together in just weeks or even days. However, modern software tools often conceal from the software developer information concerning the number and names of files produced during the development process. When utilizing existing configuration management systems, it is generally incumbent upon the software developer to fully understand the nature of the files being created and to appropriately interact with the configuration management system in order to properly control such files. When large number of such software “artifact” files are created during the development process, management of the aggregate set of files associated with a given development project may become unduly burdensome.
For these and other reasons, existing configuration management systems are often seen as a hindrance in this environment of rapid application development. That is, the engineers and other professionals engaged in software development often view configuration management simply as a way of backing up work or of aiding other members of the software development team (e.g., “build managers” or “testers”). Software developers have shown reticence in invoking a configuration management system each time a new file generated, or when an existing file is modified or renamed. In short, software developers are typically loathe to spend time interacting with configuration management systems, and would likely be receptive to a configuration management system that is more automatic and less intrusive.